package org.scala.test.implicit1

import java.io.File
import scala.io.Source

import MyPredef2._ ;

/**
 * implicit所有隐式值和隐式方法，都必须放到 object 中。
 * implicit 门面类
 */
object MyPredef2{
 
  implicit def fileToRichFile(f:File) = new RichFile(f)
}

class RichFile(val f:File){
  
  def read() = Source.fromFile(f).mkString
}

object RichFile {
  
  def main(args: Array[String]): Unit = {
     
    val f = new File("d:/read.txt");
    // 因 File中没有提供read这个方法，
    /**
     * 在java中扩充类库的三种方式:继承，代理，装饰 。
     * 在scala也可用这三种方法，但可以用implicit 
     */
   // val content = f.read
    
     
    // 使用类似 装饰模式方法调用 
    val content = new RichFile(f).read() 
    println(content) 
    
    // import MyPredef2._ ;  // 写在一个文件中的话，必须把MyPredef2写在此object前面
    val content1 = f.read()
    println(content1)
    
  }
}